--[[
    通常和设备的串口或其他io传输数据都是用TLV格式，通常数据都是由三个域构成：标识域（Tag）+长度域（Length）+值域（Value）+CRC校验
    Lua没有字节类型，只能用16进制字符串来表示一个字节，这里用一个队列来模拟，一个线程不断的发送数据，主线程接收数据
--]]
-------------------模块区-------------------
local logger = require("dx_logger")
local thread = require("dx_thread")
local queue  = require("dx_queue")
local util   = require("dx_util")

-------------------变量区-------------------
local data = {}
-------------------函数区-------------------
local function init()
    -- 创建一个queue对象，初始化大小是100
    data.myqueue = queue.create(100)
end

local function main()
    logger.debug("启动线程1")
    init()
    -- TODO 下一个版本优化，不需要写这么长的路径前缀
    thread.create("/dx_cc101_app/src/thread1.lua", data)

    while true do
        local f = queue.pop(data.myqueue, 0)
        if (f == "55") then
            local result = { "55", "AA" }
            local s = queue.pop(data.myqueue, 0)
            if (s == "AA") then
                local l = queue.pop(data.myqueue, 0)
                l = l .. queue.pop(data.myqueue, 0)
                l = l .. queue.pop(data.myqueue, 0)
                l = l .. queue.pop(data.myqueue, 0)
                local length = tonumber(l, 16)

                table.insert(result, l)
                for i = 1, length do
                    table.insert(result, queue.pop(data.myqueue, 0))
                end
                local crc = queue.pop(data.myqueue, 0)
                local temp = util.crc(result)
                if (crc ~= temp) then
                    logger.error("CRC校验没通过:" .. crc .. "!=" .. temp)
                end

                logger.debug("收到数据:", table.concat(result))
            end
        end
    end
end

-------------------主流程-------------------
main()
